﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Storage;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using System.Threading;

namespace GameProject
{
    /// <summary>
    /// Själva klassen för kuben.
    /// Tar input från användare och gör att kuben hoppar,
    /// samt gör att den hela tiden rör sig framåt.
    /// Klassen involverar även kollisionskontroll.
    /// </summary>
    public class Cube
    {
        //private SpriteBatch spriteBatch = null;
        public Texture2D CubeTexture;
        public Vector2 spriteOrigin;
        public Vector2 Position;
        public Rectangle spriteRectangle;

        private bool Dead;

        public bool dead
        {
            get { return Dead; }
            set { Dead = value; }
        }

        public bool Gravity;

        float rotation = 0;
        public Vector2 Velocity;
        

        private bool hasJumped;

        public bool hasjumped
        {
            get { return hasJumped; }
            set { hasJumped = value; }
        }


        public Cube(Texture2D newTexture, Vector2 newPosition) // Konstruktor
        {
            CubeTexture = newTexture;
            Position = newPosition;
            hasJumped = true;
            Gravity = true;
        }
        
        /// <summary>
        /// Uppdaterar kubens position enligt 
        /// spelarens input.
        /// </summary>
        /// <param name="gameTime"></param>
        public void Update(GameTime gameTime) // Updaterar Kubens position
        {

            if (Gravity == true)
            {
                Position.Y += Velocity.Y;
                Position.X += 5f;
                spriteRectangle = new Rectangle((int)Position.X, (int)Position.Y, CubeTexture.Width, CubeTexture.Height);
                spriteOrigin = new Vector2(spriteRectangle.Width / 2, spriteRectangle.Height / 2);


                if (Keyboard.GetState().IsKeyDown(Keys.Space) && hasJumped == false)
                {
                    Position.Y -= 15f;
                    Velocity.Y = -5f;
                    hasJumped = true;

                }
                else
                {
                    hasJumped = true;
                }


                if (hasJumped == true)
                {
                    rotation -= 0.13f;
                }

                if (hasJumped == true)
                {
                    float i = 1;
                    Velocity.Y += 0.25f * i;
                }


                if (hasJumped == false)
                {
                    Velocity.Y = 0f;
                }

            }

            else
            {
                Position.Y -= Velocity.Y;
                Position.X += 5f;
                spriteRectangle = new Rectangle((int)Position.X, (int)Position.Y, CubeTexture.Width, CubeTexture.Height);
                spriteOrigin = new Vector2(spriteRectangle.Width / 2, spriteRectangle.Height / 2);


                if (Keyboard.GetState().IsKeyDown(Keys.Space) && hasJumped == false)
                {
                    Position.Y += 15f;
                    Velocity.Y = -5f;
                    hasJumped = true;

                }
                else
                {
                    hasJumped = true;
                }


                if (hasJumped == true)
                {
                    rotation -= 0.13f;
                }

                if (hasJumped == true)
                {
                    float i = 1;
                    Velocity.Y += 0.25f * i;
                }


                if (hasJumped == false)
                {
                    Velocity.Y = 0f;
                }
            }

            

        }
        
        /// <summary>
        /// Aagör ifall kuben har kolliderat med tiles
        /// och önskat beteende av kuben görs. 
        /// </summary>
        /// <param name="newRectangle"></param>
        /// <param name="xOffset"></param>
        /// <param name="yOffset"></param>
        /// <returns></returns>
        public bool Collision(Rectangle newRectangle, int xOffset,int yOffset) 
        {
            if (Gravity == true)
            {
                if (spriteRectangle.TouchTopOf(newRectangle))
                {
                    spriteRectangle.Y = newRectangle.Y - spriteRectangle.Y;
                    Velocity.Y = 0f;
                    hasJumped = false;
                    rotation = 0;
                    return true;

                }


                if (spriteRectangle.TouchLeftOf(newRectangle))
                {
                    Position.X = newRectangle.X - spriteRectangle.Width - 2; // Visar att cuben är död vid krock
                    dead = true;
                    return true;
                     
                }

                if (spriteRectangle.TouchRightOf(newRectangle))
                {
                    Position.X = newRectangle.X + newRectangle.Width + 2; // Visar att cuben är död vid krock
                    dead = true;
                    return true;

                }


                if (Position.Y > yOffset - spriteRectangle.Height)
                {
                    dead = true;
                    return true;
                }
                 
                if(Position.Y < 0 - spriteRectangle.Height)
                {
                    dead = true;
                    return true;
                }

                else { return false; }
            }

            else 
            {

                if (spriteRectangle.TouchBottomOf(newRectangle))
                {
                    spriteRectangle.Y = newRectangle.Y - spriteRectangle.Y;
                    Velocity.Y = 0f;
                    hasJumped = false;
                    rotation = 0;
                    return true;

                }

                if (spriteRectangle.TouchLeftOf(newRectangle))
                {
                    Position.X = newRectangle.X - spriteRectangle.Width - 2; // Visar att cuben är död vid krock
                    dead = true;
                    return true;

                }

                if (spriteRectangle.TouchRightOf(newRectangle))
                {
                    Position.X = newRectangle.X + newRectangle.Width + 2; // Visar att cuben är död vid krock
                    dead = true;
                    return true;

                }
                
               if (Position.Y > yOffset - spriteRectangle.Height)
               {
                   dead = true;
                   return true;
               }

               if (Position.Y < 0 - spriteRectangle.Height)
               {
                   dead = true;
                   return true;
               }

                else { return false; }
            }

        }

        /// <summary>
        /// Kuben målas ut.
        /// </summary>
        /// <param name="spriteBatch"></param>
        public void Draw(SpriteBatch spriteBatch)
        {

            //spriteBatch.Draw(CubeTexture, Position, null, Color.White, rotation, spriteOrigin, 1f, SpriteEffects.None, 0f);
       
            spriteBatch.Draw(CubeTexture, Position, Color.White);
            //spriteBatch.Draw(CubeTexture, Position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
        }

        
    }
}
